// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLExprImpl;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.ast.SQLReplaceable;
// import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
// import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
// import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.Collections;
// import java.util.List;
#pragma once
#include "../../../../ast/SQLExprImpl.h"
#include "../../../../ast/SQLReplaceable.h"
#include "../../../../ast/expr/SQLLiteralExpr.h"
#include "OracleExpr.h"

class OracleIntervalExpr
    : virtual public SQLExprImpl,
      virtual public SQLLiteralExpr,
      virtual public OracleExpr,
      virtual public SQLReplaceable
{
public:
  SQLExpr_ptr value;
  OracleIntervalType_ptr type;
  SQLExpr_ptr precision;
  int factionalSecondsPrecision;
  OracleIntervalType_ptr toType;
  SQLExpr_ptr toFactionalSecondsPrecision;

  OracleIntervalExpr();

  SHAREDOBJECT(OracleIntervalExpr);
  // @Override
  SQLObject_ptr clone();

  // @Override
  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  // @Override
  SQLObject_list_ptr getChildren();

  SQLExpr_ptr getValue();

  void setValue(SQLExpr_ptr value);

  OracleIntervalType_ptr getType();

  void setType(OracleIntervalType_ptr type);

  SQLExpr_ptr getPrecision();

  void setPrecision(int precision);

  void setPrecision(SQLExpr_ptr precision);

  int getFactionalSecondsPrecision();

  void setFactionalSecondsPrecision(int factionalSecondsPrecision);

  OracleIntervalType_ptr getToType();

  void setToType(OracleIntervalType_ptr toType);

  SQLExpr_ptr getToFactionalSecondsPrecision();

  void setToFactionalSecondsPrecision(SQLExpr_ptr x);

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  // @Override
  void accept0(OracleASTVisitor_ptr visitor);

  // @Override
  int hashCode();

  // @Override
  bool equals(Object_ptr obj);
};
